package com.permission.common;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import com.permission.exception.ParamException;
import com.permission.exception.PermissionException;

import lombok.extern.slf4j.Slf4j;

/**
 * 全局异常处理
 * @author jing
 */
@Slf4j
public class SpringExceptionResolver implements HandlerExceptionResolver {

	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception ex) {
		//根据request拿出当前访问的URL
		String url = request.getRequestURI().toString();
		ModelAndView mv;
		//定义一个未知异常
		String defaultMsg = "System error(未知系统错误)";
		
		//对数据请求和页面请求做处理
		//根据接口的后缀判断请求的是页面还是数据  .json  .page
		//这里我们要求项目中所有请求JSON数据的链接，都是用“.json”结尾，请求页面的链接使用“.page”结尾
		if(url.endsWith(".json")){
			if(ex instanceof PermissionException || ex instanceof ParamException){
				JsonData result = JsonData.fail(ex.getMessage());
				// jsonView 就是在springmvc.xml配置的jsonView，以json格式返回
				mv = new ModelAndView("jsonView",result.toMap());
			}else{
				// 未知异常
				log.error("未知的json请求异常,来自:"+url,ex);
				JsonData result = JsonData.fail(defaultMsg);
				mv = new ModelAndView("jsonView",result.toMap());
			}			
		}else if(url.endsWith(".page")){
			log.error("未知的页面请求异常，来自:"+url,ex);
			JsonData result = JsonData.fail(defaultMsg);
			//"exception" ：会去前端页面中寻找一个名字叫exception的页面
			mv = new ModelAndView("exception",result.toMap());
		}else{
			log.error("未知的系统异常，来自:"+url,ex);
			JsonData result = JsonData.fail(defaultMsg);
			mv = new ModelAndView("jsonView",result.toMap());
		}		
		return mv;
	}

}
